package com.atguigu.daijia.common.util;

import io.micrometer.common.util.StringUtils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;

/*
@description:类型转换器
@ClassName Convert
@author chen
@create 2024-08-22 14:16
@Version 1.0
*/
public class Convert {

    /*
     * @param value   被转换的值
     * @==============History===============<br/>;
     * @Description // 转换失败不会报错,或者转换失败,返回null
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String toStr(Object value)
    {
        return toStr(value, null);
    }

    /*
     * @param value        转换字段
     * @param defaultValue 转换失败的默认值
     * @==============History===============<br/>;
     * @Description //   转换为字符串,如果给定的值为null，或者转换失败，返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String toStr(Object value, String defaultValue)
    {
        if(value == null)
        {
            return defaultValue;
        }
        if(value instanceof String)
        {
            return (String) value;
        }
        return value.toString();
    }


    /*
     * @param value    被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为字符,如果给定的值为null,或者转换失败,返回null,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Character toChar(Object value)
    {
        return toChar(value, null);
    }

    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为字符,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Character toChar(Object value, Character defaultValue)
    {
        if(value == null)
        {
            return defaultValue;
        }
        if (value instanceof Character)
        {
            return (Character) value;
        }
        final String valueStr = toStr(value, null);
        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
    }

    /*
     * @param input         被转换的值
     * @==============History===============<br/>;
     * @Description //   替换全角为半角
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String toDBC(String input)
    {
        return toDBC(input, null);
    }


    /*
     * @param input         被转换的值
     * @param notConvertSet 不替换的字符集合
     * @==============History===============<br/>;
     * @Description //   替换全角为半角
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String toDBC(String text, Set<Character> notConvertSet)
    {
        char c[] = text.toCharArray();
        for (int i = 0; i < c.length; i++)
        {
            if (null != notConvertSet && notConvertSet.contains(c[i]))
            {
                // 跳过不替换的字符
                continue;
            }

            if (c[i] == '\u3000')
            {
                c[i] = ' ';
            }
            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
            {
                c[i] = (char) (c[i] - 65248);
            }
        }

        return new String(c);
    }



    /*
     * @param input         被转换的值
     * @==============History===============<br/>;
     * @Description //   半角转全角
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String toSBC(String input)
    {
        return toSBC(input, null);
    }


    /*
     * @param input         被转换的值
     * @param notConvertSet 不替换的字符集合
     * @==============History===============<br/>;
     * @Description //   半角转全角
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String toSBC(String input, Set<Character> notConvertSet)
    {
        char c[] = input.toCharArray();
        for (int i = 0; i < c.length; i++)
        {
            if (null != notConvertSet && notConvertSet.contains(c[i]))
            {
                // 跳过不替换的字符
                continue;
            }

            if (c[i] == ' ')
            {
                c[i] = '\u3000';
            }
            else if (c[i] < '\177')
            {
                c[i] = (char) (c[i] + 65248);

            }
        }
        return new String(c);
    }


    /*
     * @param value      被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为byte,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Byte toByte(Object value)
    {
        return toByte(value, null);
    }

    
    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为byte,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Byte toByte(Object value, Byte defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Byte)
        {
            return (Byte) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).byteValue();
        }
        
        final String valueStr = toStr(value, null);
        
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Byte.parseByte(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /*
     * @param value    被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Short,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Short toShort(Object value)
    {
        return toShort(value, null);
    }

    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Short,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Short toShort(Object value, Short defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Short)
        {
            return (Short) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).shortValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Short.parseShort(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Number,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Number toNumber(Object value)
    {
        return toNumber(value, null);
    }


    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Number,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Number toNumber(Object value, Number defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Number)
        {
            return (Number) value;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return NumberFormat.getInstance().parse(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Long,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Long toLong(Object value)
    {
       return toLong(value, null);
    }

    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Long,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Long toLong(Object value, Long defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Long)
        {
            return (Long) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).longValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).longValue();
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Integer,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Integer toInt(Object value)
    {
        return toInt(value, null);
    }


    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Integer,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Integer toInt(Object value, Integer defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Integer)
        {
            return (Integer) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).intValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Integer.parseInt(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Double,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Double toDouble(Object value)
    {
        return toDouble(value,null);
    }

    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Double,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Double toDouble(Object value, Double defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Double)
        {
            return (Double) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).doubleValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).doubleValue();
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为BigDecimal,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static BigDecimal toBigDecimal(Object value)
    {
        return toBigDecimal(value, null);
    }


    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为BigDecimal,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof BigDecimal)
        {
            return (BigDecimal) value;
        }
        if (value instanceof Long)
        {
            return new BigDecimal((Long) value);
        }
        if (value instanceof Double)
        {
            return new BigDecimal((Double) value);
        }
        if (value instanceof Integer)
        {
            return new BigDecimal((Integer) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return new BigDecimal(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }


    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为BigInteger,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static BigInteger toBigInteger(Object value)
    {
        return toBigInteger(value, null);
    }


    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为BigInteger,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof BigInteger)
        {
            return (BigInteger) value;
        }
        if (value instanceof Long)
        {
            return BigInteger.valueOf((Long) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return new BigInteger(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }



    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Boolean,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Boolean toBool(Object value)
    {
        return toBool(value, null);
    }

    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Boolean,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Boolean toBool(Object value, Boolean defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Boolean)
        {
            return (Boolean) value;
        }
        String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        valueStr = valueStr.trim().toLowerCase();
        switch (valueStr)
        {
            case "true":
                return true;
            case "false":
                return false;
            case "yes":
                return true;
            case "ok":
                return true;
            case "no":
                return false;
            case "1":
                return true;
            case "0":
                return false;
            default:
                return defaultValue;
        }
    }

    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Float,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Float toFloat(Object value)
    {
        return toFloat(value,null);
    }

    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Float,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Float toFloat(Object value, Float defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Float)
        {
            return (Float) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).floatValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Float.parseFloat(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }

    /*
     * @param value        被转换的值
     * @==============History===============<br/>;
     * @Description //   转换为Date,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Date toDate(Object value){
        return toDate(value,null);
    }


    /*
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @==============History===============<br/>;
     * @Description //   转换为Date,如果给定的值为null,或者转换失败,返回默认值,转换失败不会报错
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Date toDate(Object value, Date defaultValue){
        if(null == value){
            return defaultValue;
        }
        if(value instanceof Date){
            return (Date) value;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return simpleDateFormat.parse(valueStr);
        } catch (ParseException e) {
            return defaultValue;
        }
    }



    /*
     * @param str         被转换的字符串
     * @==============History===============<br/>;
     * @Description //   将字符串转换为Integer数组,以逗号为分隔符
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Integer[] toIntArray(String str)
    {
        return toIntArray(",", str);
    }

    /*
     * @param split       分隔符
     * @param str         被转换的字符串
     * @==============History===============<br/>;
     * @Description //   将字符串转换为Integer数组
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Integer[] toIntArray(String split, String str)
    {
        if (StringUtils.isEmpty(str))
        {
            return new Integer[] {};
        }
        String[] arr = str.split(split);
        final Integer[] ints = new Integer[arr.length];
        for (int i = 0; i < arr.length; i++)
        {
            final Integer v = toInt(arr[i], 0);
            ints[i] = v;
        }
        return ints;
    }

    /*
     * @param str         被转换的字符串
     * @==============History===============<br/>;
     * @Description //   将字符串转换为Long数组
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Long[] toLongArray(String str)
    {
        return toLongArray(",", str);
    }


    /*
     * @param split       分隔符
     * @param str         被转换的字符串
     * @==============History===============<br/>;
     * @Description //   将字符串转换为Long数组
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static Long[] toLongArray(String split, String str)
    {
        if (StringUtils.isEmpty(str))
        {
            return new Long[] {};
        }
        String[] arr = str.split(split);
        final Long[] longs = new Long[arr.length];
        for (int i = 0; i < arr.length; i++)
        {
            final Long v = toLong(arr[i], null);
            longs[i] = v;
        }
        return longs;
    }

    /*
     * @param str         被转换的字符串
     * @==============History===============<br/>;
     * @Description //   将字符串转换为字符串数组
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String[] toStrArray(String str)
    {
        return toStrArray(",", str);
    }

    /*
     * @param split       分隔符
     * @param str         被转换的字符串
     * @==============History===============<br/>;
     * @Description //   将字符串转换为字符串数组
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String[] toStrArray(String split, String str)
    {
        return str.split(split);
    }

    
    /*
     * @param n          数字金额大写转换 先写个完整的然后将如零拾替换成零
     * @==============History===============<br/>;
     * @Description //   数字转中文大写数字
     * @Date 2024/8/22
     * @Author < a href="15991488967@163.com">chen</ a>;
     */
    public static String digitUppercase(double n)
    {
        String[] fraction = { "角", "分" };
        String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
        String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };

        String head = n < 0 ? "负" : "";
        n = Math.abs(n);

        String s = "";
        for (int i = 0; i < fraction.length; i++)
        {
            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
        }
        if (s.length() < 1)
        {
            s = "整";
        }
        int integerPart = (int) Math.floor(n);

        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
        {
            String p = "";
            for (int j = 0; j < unit[1].length && n > 0; j++)
            {
                p = digit[integerPart % 10] + unit[1][j] + p;
                integerPart = integerPart / 10;
            }
            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
        }
        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
    }


}
